<?php
declare (strict_types = 1);
namespace app\index\middleware;
class SignCheck
{
    public function handle($request, \Closure $next)
    {
        //秘钥和前端保持一致
        $app_secret= substr(md5('xtrbxtw@yhzxyhzx'),8,16);
        $sign=$request->header('sign');
        $posttime=$request->param('timer');
        $postnonce=$request->param('nonce');
        $nowtime =getMillisecond();
        //判断是否有timer字段，没有则禁止提交
        if(!$posttime){
            return fail('','缺少timer');
        }
        //判断是否在指定的时间阈值内 超过则禁止提交  10秒
        if($nowtime-$posttime>1000*10){
            return fail('','访问超时');
        }
        //判断随机字符串 没有则禁止提交
        if(!$postnonce){
            return fail('','缺少nonce');
        }else{
           $chnonce=cache($postnonce);
           //如果缓存中有说明重复提交 禁止提交
           if($chnonce){
            return fail("","禁止重复提交");
           }else{
            //缓存没有则写入缓存1分钟防止重复提交
            cache($postnonce,$postnonce,30);
           }
        }
        //转换为url参数形式
        $urlparam=http_build_query($request->param());
        //所有参数根据提交时间进行重新加密
        $phpsign =secret_sign($urlparam,$app_secret,false);  
        //重新加密后的签名是否和接收的签名一致，不一致说明参数被修改过禁止提交
        if($sign!=$phpsign){
            return fail('','签名错误');
        }
        return $next($request);
    }
}